/*
 * Transaction.java
 *
 * Created on 24 de enero de 2008, 11:27
 *
 */

package es.team.util.beans;

import es.team.util.StringBufferLn;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

/**
 * Bean que agrupa los datos de conexion necesarios para distintas aplicaciones
 * @author Victor Gimeno (SGV, SL)
 */
public class Transaction {
    
    private Connection con;
    
    private String appName;
            
    private String dsName;
    
    private String basicRolName;
    
    private String mainRolName;
    
    private String propName;
    
    private static boolean autoCommit;
    
    private String sql;
    
    /**
     * Crea una nueva instancia de Transaction
     */
    public Transaction() {
        
        this.con = null;
        this.appName = "";
        this.dsName = "";
        this.basicRolName = "";
        this.mainRolName = "";
        this.propName = "";
        this.setAutoCommit(false);
        this.sql = "";
    }

    /**
     * Crea una nueva instancia de Transaction
     * @param appName aplicaci�n
     */
    public Transaction( String appName ) {
        
        this.con = null;
        this.appName = appName;
        this.dsName = "";
        this.basicRolName = "";
        this.mainRolName = "";
        this.propName = "";
        this.setAutoCommit(false);
        this.sql = "";
    }

    public Connection getConnection() {
        System.out.println("En getConnection");
        return con;
    }

    public void setConnection(Connection con) {
        this.con = con;
    }
    
    public String getAppName() {
        return appName;
    }

    public void setAppName(String appName) {
        this.appName = appName;
    }

    public String getDsName() {
        return dsName;
    }

    public void setDsName(String dsName) {
        this.dsName = dsName;
    }

    public String getBasicRolName() {
        return basicRolName;
    }

    public void setBasicRolName(String basicRolName) {
        this.basicRolName = basicRolName;
    }

    public String getMainRolName() {
        return mainRolName;
    }

    public void setMainRolName(String mainRolName) {
        this.mainRolName = mainRolName;
    }

    public String getPropName() {
        return propName;
    }

    public void setPropName(String propName) {
        this.propName = propName;
    }

    public static boolean isAutoCommit() {
        return autoCommit;
    }

    public static void setAutoCommit(boolean aAutoCommit) {
        autoCommit = aAutoCommit;
    }
        
    public String getSql() {
        return sql;
    }

    public void setSql(String sql) {
        this.sql = sql;
    }

      
    /** 
     * M�todo que devuelve un Statement, un objeto utilizado para ejecutar sql est�ticas
     * @return Statement
     * @throws java.sql.SQLException 
     */
    public Statement creaSentencia() throws SQLException{
        return con.createStatement(
                ResultSet.TYPE_SCROLL_INSENSITIVE,
                ResultSet.CONCUR_READ_ONLY
                );
    }
    
    
     /** M�todo llamado desde ejecutaSentencia
     * @param sql sql a ejecutar.
      * @return  la interface utilizada para guardar sentencia sql
      * @throws java.sql.SQLException 
     */
    public PreparedStatement creaPreSentencia(String sql) throws SQLException{
        return con.prepareStatement(sql,
                ResultSet.TYPE_SCROLL_INSENSITIVE,
                ResultSet.CONCUR_READ_ONLY
                );
    }
    
     /** M�todo llamado desde ejecutaLlamada.
     * @param llamada sql a ejecutar.
      * @return la interface utilizada para ejecutar procedimientos almacenados.
      * @throws java.sql.SQLException 
     */
    public CallableStatement prepareCall(String llamada) throws SQLException{
        return con.prepareCall(llamada);
    }
    
    /** M�todo llamado desde ejecutaLlamada.
     * @return la interface utilizada para ejecutar procedimientos almacenados.
     * @throws java.sql.SQLException 
     */
    public CallableStatement prepareCall() throws SQLException{
        return con.prepareCall( sql );
    }
    
    /** Ejecuta una sentencia SQL 
     * @param sql a ejecutar
     * @return ResultSet con los registros que devuelve la consulta.
     * @throws java.sql.SQLException 
     */
    public ResultSet ejecutaSentencia(String sql)throws SQLException{
        Statement st=this.creaSentencia();
        return st.executeQuery( sql );
    }
    
    /** Ejecuta una sentencia SQL 
     * @return ResultSet con los registros que devuelve la consulta.
     * @throws java.sql.SQLException 
     */
    public ResultSet ejecutaSentencia()throws SQLException{
        Statement st=this.creaSentencia();
        return st.executeQuery( sql );
    }
    
    /** Ejecuta una sentencia SQL 
     * @param sql a ejecutar
     * @return ResultSet con los registros que devuelve la consulta.
     * @throws java.sql.SQLException 
     */
    public ResultSet ejecutaPreSentencia(String sql)throws SQLException{
        PreparedStatement st=this.creaPreSentencia(sql);
        return st.executeQuery();
    }
    
    /** Ejecuta una sentencia SQL 
     * @return ResultSet con los registros que devuelve la consulta.
     * @throws java.sql.SQLException 
     */
    public ResultSet ejecutaPreSentencia()throws SQLException{
        PreparedStatement st=this.creaPreSentencia(sql);
        return st.executeQuery();
    }
    
    /** Ejecuta una sentencia de llamada a un procedimiento
     * @param llamada sql a ejecutar.
     * @return ResultSet con los registros que devuelve el procedimiento.
     * @throws java.sql.SQLException 
     */
    public ResultSet ejecutaCallable(String llamada)throws SQLException{
        CallableStatement cs = this.prepareCall(llamada);
        return cs.executeQuery();
    }
    
    
    /** Ejecuta una sentencia de llamada a un procedimiento
     * @return ResultSet con los registros que devuelve el procedimiento.
     * @throws java.sql.SQLException 
     */
    public ResultSet ejecutaCallable()throws SQLException{
        CallableStatement cs = this.prepareCall(sql);
        return cs.executeQuery();
    }
    
    /** 
     * Ejecuta una sentencia de manipulaci�n de datos
     * @param sql a ejecutar.
     * @return el n�mero de registros que devuelve la sentencia INSERT, DELETE o UPDATE.0 si la sql no devuelve nada.
     * @throws java.sql.SQLException 
     */
    public int actualiza(String sql)throws SQLException{
        Statement st=con.createStatement(
                ResultSet.TYPE_SCROLL_INSENSITIVE,
                ResultSet.CONCUR_UPDATABLE
                );
        return st.executeUpdate(sql);
    }
    
    /** 
     * Hace commit en la conexi�n
     * @throws java.sql.SQLException 
     */
    public void trCommit()throws SQLException{
        con.commit();
    }
    
    /** Realiza rollback en la conexi�n
     * @throws java.sql.SQLException 
     */
    public void trRollback()throws SQLException{
        con.rollback();
    }
    
    /** 
     * Cierra el ResultSet y el Statement de dicho ResultSet
     * @param rs ResultSet a cerrar.
     */
    public void closeResultSet(ResultSet rs) {
        if (rs == null) return;
        try {
            Statement st = rs.getStatement();
            rs.close();
            st.close();
            st = null;
            rs = null;
        } catch (Exception anyEx) {
            //ignored
        }
    }
    
    
  /** 
   * Cierra la conexi�n 
   */
   public void close() {
       try {
           if (con != null && !con.isClosed()) {
               con.close(); 
               con = null; 
           }
       } catch (Exception ignored) {;}
   }
   
   /**
    * Cierra la conexion incluido un ResulSet con su Statement
    * @param rs resulset
    */
   public void close(ResultSet rs){
       
       closeResultSet( rs );
       close();
       
   }

    public String toString() {
        
        StringBufferLn sb = new StringBufferLn();
        
        sb.appendLn("**DEBUG de TRANSACTION**");
        sb.appendLn("\tConnection:"+getConnection());
        sb.appendLn("\tappName:"+getAppName());
        sb.appendLn("\tdsName:"+getDsName());
        sb.appendLn("\tbasicRolName:"+getBasicRolName());
        sb.appendLn("\tmainRolName:"+getMainRolName());
        sb.appendLn("\tpropName:"+getPropName());
        sb.appendLn("\tsql:"+getSql());
        
        sb.appendLn("**FIN DEBUG TRANSACTION**");
        
        return sb.toString();
    }

}
